const express = require('express')
const { getDb, saveDb } = require('./db')

const app = express()
// 配置解析表单请求体 application/json
app.use(express.json())
// 配置解析 application/x-www-form-urlencoded表单请求体数据
app.use(express.urlencoded({ extended: false }))

app.get('/todos', async (req, res) => {
    try {
        const db = await getDb()
        res.status(200).json(db.todos)
    } catch (err) {
        res.status(500).json({
            error: err.message
        })
    }
})
app.get('/todos/:id', async (req, res) => {
    try {
        const db = await getDb()
        const find = db.todos.find(x => x.id === Number.parseInt(req.params.id))
        if (!find) {
            return res.status(404).end()
        }
        res.status(200).json(find)
    } catch (err) {
        res.status(500).json({
            error: err.message
        })
    }
})
app.post('/todos', async (req, res) => {
    try {
        // 1. 获取客户端请求体参数
        const todo = req.body
        // 2. 数据验证
        if (!todo.title) {
            return res.status(422).json({
                error: '需提供title字段且数据不能为空'
            })
        }
        // 3. 数据验证通过，将数据存储在db中
        const db = await getDb()
        const lastTodo = db.todos[db.todos.length - 1]
        todo.id = lastTodo ? lastTodo.id + 1 : 1
        db.todos.push(todo)
        await saveDb(db)
        // 4. 发送响应
        res.status(201).json(todo)
    } catch (err) {
        res.status(500).json({
            error: err.message
        })
    }
})
app.patch('/todos/:id', async (req, res) => {
    try {
        const todo = req.body
        const db = await getDb()
        const find = db.todos.find(x => x.id === Number.parseInt(req.params.id))
        if (!find) {
            return res.status(404).end()
        }
        Object.assign(find, todo)
        await saveDb(db)
        res.status(200).json(find)
    } catch (err) {
        res.status(500).json({
            error: err.message
        })
    }
})
app.delete('/todos/:id', async (req, res) => {
    try {
        const db = await getDb()
        const findIndex = db.todos.findIndex(x => x.id === Number(req.params.id))
        if (findIndex < 0) {
            return res.status(404).end()
        }
        db.todos.splice(findIndex, 1)
        await saveDb(db)
        res.status(204).end()
    } catch (err) {
        res.status(500).json({
            error: err.message
        })
    }
})

app.listen(3000, () => {
    console.log('Server is running at http://localhost:3000/')
})